package com.siashan.unipay4j.wx.model;

import com.alibaba.fastjson.annotation.JSONField;
import lombok.Data;

/**
 * V3订单查询结果
 *
 * @author siashan
 * @since v2.0.1
 **/
@Data
public class QueryOrderResult {
    /**
     * 直连商户申请的公众号或移动应用appid
     */
    private String appid;
    /**
     * 直连商户的商户号，由微信支付生成并下发。
     */
    private String mchid;

    /**
     * 商户系统内部订单号
     */
    @JSONField(name = "out_trade_no")
    private String outTradeNo;

    /**
     * 微信支付系统生成的订单号
     */
    @JSONField(name = "transaction_id")
    private String transactionId;

    /**
     * 交易类型
     *
     * @apiNote 交易类型，枚举值：
     * JSAPI：公众号支付
     * NATIVE：扫码支付
     * APP：APP支付
     * MICROPAY：付款码支付
     * MWEB：H5支付
     * FACEPAY：刷脸支付
     */
    @JSONField(name = "trade_type")
    private String tradeType;

    /**
     * 交易状态
     *
     * @apiNote 交易状态，枚举值：
     * SUCCESS：支付成功
     * REFUND：转入退款
     * NOTPAY：未支付
     * CLOSED：已关闭
     * REVOKED：已撤销（仅付款码支付会返回）
     * USERPAYING：用户支付中（仅付款码支付会返回）
     * PAYERROR：支付失败（仅付款码支付会返回）
     */
    @JSONField(name = "trade_state")
    private String tradeState;
    /**
     * 交易状态描述
     */
    @JSONField(name = "trade_state_desc")
    private String tradeStateDesc;
    /**
     * 付款银行
     */
    @JSONField(name = "bank_type")
    private String bankType;
    /**
     * 附加数据
     */
    private String attach;
    /**
     * 支付完成时间
     * @apiNote 遵循rfc3339标准格式，格式为yyyy-MM-DDTHH:mm:ss+TIMEZONE，yyyy-MM-DD表示年月日，T出现在字符串中，表示time元素的开头，HH:mm:ss表示时分秒，TIMEZONE表示时区（+08:00表示东八区时间，领先UTC 8小时，即北京时间）。例如：2015-05-20T13:29:35+08:00表示，北京时间2015年5月20日 13点29分35秒。
     * 示例值：2018-06-08T10:34:56+08:00
     */
    @JSONField(name = "success_time")
    private String successTime;

    /**
     * 支付者
     */
    private Payer payer;

    /**
     * 订单金额
     *
     * @apiNote 订单金额信息，当支付成功时返回该字段。
     */
    private PayAmount amount;

    /**
     * 场景信息
     */
    @JSONField(name = "scene_info")
    private PaySceneInfo sceneInfo;


    /**
     * 优惠功能
     */
    @JSONField(name = "promotion_detail")
    private PromotionDetail[] promotionDetail;
}
